/**
 * @param {number} k  队列时先进先出 头部删除 尾部增加
 */
var MyCircularQueue = function(k) {
    // 头指针
    this.front = 0
    // 尾指针
    this.rear = 0
    // 最大的容量
    this.max = k
    // 定义一个数组  ---长度为k的空数组
    this.list = Array(k)
};

/**
 * @param {number} value
 * @return {boolean}
 */
//向循环队列插入一个元素。如果成功插入则返回真
/*
首先判断数据是否已满 如果已经满了 返回false  如果没有满  则数组加入数据
并且尾指针后移一位 因为是循环队列 所以判断（尾指针 + 1） % 最大的容量的余数  并且将余数给尾指针
* */
MyCircularQueue.prototype.enQueue = function(value) {
    if (this.isFull()) {
        return false
    }else {
        this.list[this.rear] = value
        this.rear = (this.rear + 1) % this.max
        return true
    }
};
/**
 * @return {boolean}
 */
//从循环队列中删除一个元素。如果成功删除则返回真
/*
先判断数组是否为空 如果为空 返回false
删除时 将头指针的数据设为空 然后头指针后移 因为循环队列 则判断（头指针 + 1） % max 的余数 并且将余数给头指针
* */
MyCircularQueue.prototype.deQueue = function() {
    let v = this.list[this.front]
    this.list[this.front] = undefined
    if (v != undefined) {
        this.front = (this.front + 1) % this.max
        return true
    }else {
        return false
    }
};
/**
 * @return {number}
 */
// 从队首获取元素。如果队列为空，返回 -1
/*
判断数组是否为空  如果为空 返回1  如果不为空 根据头部指针返回数据
* */
MyCircularQueue.prototype.Front = function() {
    if (this.list[this.front] == undefined) {
        return -1
    }else {
        return this.list[this.front]
    }
};
/**
 * @return {number}
 */
// 获取队尾元素。如果队列为空，返回 -1 。
/*
* 先判断数组是否为空 如果为空返回1
* 如果不为空 需要判断尾指针的位置 尾元素是尾部指针-1 的数据 如果尾部指针-1 >= 0 说明可直接返回尾部指针-1的数据，
* 如果尾部指针-1<0， 说明尾指针在队首，需要取list最后一个值，根据max-1来取
* */
MyCircularQueue.prototype.Rear = function() {
    let rear = this.rear -1
    if (this.list[rear < 0 ? this.max -1 : rear]  == undefined) {
        return -1
    }else {
        return this.list[rear < 0 ? this.max -1 : rear]
    }
};

/**
 * @return {boolean}
 */
// 检查循环队列是否为空。
/*头尾指针处于同一位置 且头指针数据为空
* */
MyCircularQueue.prototype.isEmpty = function() {
    return this.front == this.rear && !this.list[this.front]
};

/**
 * @return {boolean}
 */
// 检查循环队列是否已满。
/*头尾指针处于同一位置 且头指针数据不为空
* */
MyCircularQueue.prototype.isFull = function() {
    return (this.front == this.rear) && !!this.list[this.front]
};

/**
 * Your MyCircularQueue object will be instantiated and called as such:
 * var obj = new MyCircularQueue(k)
 * var param_1 = obj.enQueue(value)
 * var param_2 = obj.deQueue()
 * var param_3 = obj.Front()
 * var param_4 = obj.Rear()
 * var param_5 = obj.isEmpty()
 * var param_6 = obj.isFull()
 */